//
//  main.m
//  04-集合2
//
//  Created by 曹曹 on 16/7/7.
//  Copyright © 2016年 曹曹. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Contact.h"
#import "Manager.h"

int main(int argc, const char * argv[]) {
    // 1.字典
    // 存储键值对(key-value)的集合类型
    // 字典中存储数据没有顺序
    // 通过key值存储, 查询value
    // 1> 初始化
    // initWithObjectAndKeys:value, key, value, key, ...
    // 字典中只能存放对象类型(NSObject的子类)
    // 如果出现汉字, 代码提示会失效
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"李四", @"name", @18, @"age", @"male", @"gender", nil];
    // 2> 构造器
    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"李四", @"name", @23, @"age", @"male", @"gender", nil];
    // 3> 字面量 字符串@"", 数值对象类型NSNumber @(), 数组@[], 字典@{key: value, key: value}
    NSDictionary *diction = @{@"name": @"李四",
                               @"age": @(-18),
                            @"gender": @"male",
                          @"fullName": @"李四"};
    // 4> 取值
    //    <1> 通过key取value
    NSString *name = [diction objectForKey:@"name"];
    NSLog(@"name is %@", name);
    //    <2> 获取所有的key
    NSArray *allKeys = diction.allKeys;
    NSLog(@"allkeys are %@", allKeys);
    //    <3> 获取所有的value
    NSArray *allValues = diction.allValues;
    NSLog(@"allValues are %@", allValues);
    //    <4> count
    NSUInteger count = diction.count;
    //    <5> 通过一个数组取到对应数组的value
    NSArray *allValueArray = [diction objectsForKeys:diction.allKeys notFoundMarker:[NSString class]];
    NSLog(@"allValueArray is %@", allValueArray);
    //    <6> 通过一个value对象, 查找所有value是这个对象的key
    NSArray *allKeysForObj = [diction allKeysForObject:@"李四"];
    NSLog(@"allKeysForObj is %@", allKeysForObj);
    //    <7> 语法糖取值 arr[下标] diction[key]
    NSLog(@"快速取值:%@", diction[@"name"]);
    
    // 可变字典 NSMutableDictionary
    // 1.初始化方式 与 不可变字典基本相同
    NSMutableDictionary *mDic = [NSMutableDictionary dictionaryWithCapacity:0];
    // (不推荐使用字面量)
    NSMutableDictionary *mDiction = [@{} mutableCopy];
    // 2.取值 与 不可变字典相同
    // 3.增 删 改
    // 1> 添加 修改 setObject:value forkey:key
    //    如果key已存在, 会将之前的value覆盖
    //    如果key不存在, 会直接添加
    // 注意: 字典中的key不要重复, 如果重复会以最后的value进行赋值
    [mDic setObject:@"180" forKey:@"height"];
    NSLog(@"mdic is %@", mDic);
    // 2> 删除
    [mDic removeObjectForKey:@"name"];
    [mDic removeObjectsForKeys:@[@"name", @"age"]];
    [mDic removeAllObjects];
    NSLog(@"mdic now is %@", mDic);
    // 3> 语法糖 与 setObject:forkey:相同
    mDic[@"name"] = @"例程";
    // 需求：1、定义联系人类Contact。实例变量：姓名(拼音，首字母大写)、性别、电话号码、住址、分组名称、年龄。方法：自定义初始化方法(姓名、电话号码)、显示联系人信息。
    // 2、在main.m中定义字典，分组管理所有联系人。分组名为26个大写的英文字母。
    // 3、可以添加联系人对象，如果姓名或电话号码为空，添加失败。添加联系人到匹配的分组。
    // 4、删除某个分组的全部联系人。
    Contact *contact1 = [[Contact alloc] initWithName:@"阿三" phoneNumber:@"110"];
    Contact *contact2 = [[Contact alloc] initWithName:@"白眼" phoneNumber:@"120"];
    Contact *contact3 = [[Contact alloc] initWithName:@"蔡明" phoneNumber:@"119"];
    Contact *contact4 = [[Contact alloc] initWithName:@"呆子" phoneNumber:@"111"];
    contact1.groupName = @"A";
    contact2.groupName = @"B";
    contact3.groupName = @"C";
    contact4.groupName = @"D";
    [contact1 showContact];
    
    NSMutableDictionary *contactDic = [NSMutableDictionary dictionary];
    {
//    // key: A~Z value: NSMutableArray
//    // 判断名字和手机号是不是空值
//    if ([contact1.name length] > 0 && [contact1.phoneNumber length] > 0) {
//        // 都不是空值, 可以添加
//        // 通过联系人的分组名, 取到对应的分组数组
//        NSMutableArray *contactArr = [contactDic objectForKey:contact1.groupName];
//        // 判断数组是否存在
//        if (contactArr == nil) {
//            // 数组不存在, 创建数组
//            contactArr = [NSMutableArray array];
//            [contactArr addObject:contact1];
//            [contactDic setObject:contactArr forKey:contact1.groupName];
//            // 数组存在, 直接添加
//        } else {
//            [contactArr addObject:contact1];
//        }
//        // 否则, 添加失败
//    } else {
//        NSLog(@"添加失败!");
//    }
    }
    Manager *manager = [[Manager alloc] initWithDictionary:contactDic];
    [manager addContact:contact1];
    [manager addContact:contact2];
    [manager addContact:contact3];
    [manager addContact:contact4];
    NSLog(@"%@", manager.contactDic);
    
    // 快速将NSNumber转换成字符串
    [@10 description];
    
    // 2.集合 (无序)
    // 不可变 NSSet 可变 NSMutableSet
    // 1> 初始化
    // 集合会删除掉重复的内容(互异性)
    // 要删除数组或者字典中重复的内容, 放入集合中即可
    NSSet *set = [[NSSet alloc] initWithObjects:@"123", @"123", @"566", nil];
    NSLog(@"%@", set);
    // 2> 构造器
    NSSet *setObj = [NSSet setWithObjects:@"李毅", @"李毅", nil];
    // 3> 没有提供集合的字面量
    // 取值
    // 从集合中取出任意元素
    [set anyObject];
    // count
    NSUInteger setCount = [set count];
    // 集合去重(删除掉数组中重复的元素)
    NSArray *repeatArr = @[@10, @10, @20, @20];
    NSLog(@"%@", repeatArr);
    NSSet *repeatSet = [NSSet setWithArray:repeatArr];
    repeatArr = repeatSet.allObjects;
    NSLog(@"%@", repeatArr);
    
    // 可变集合 NSMutableSet
    // 1> 初始化与不可变一样
    // 2> 取值 anyObject
    // 3> 可变集合 可变性
    NSMutableSet *mutableSet = [NSMutableSet set];
    // 添加
    [mutableSet addObject:@10];
    // 删除
    [mutableSet removeObject:@10];
    [mutableSet removeAllObjects];
    return 0;
}
